/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package politicasdesubstituicao;

import aplicacao.TelaPrincipal;
import aplicacao.TelaSimulador;
import auxiliar.LinhaTP;
import auxiliar.Pagina;
import auxiliar.Processo;
import auxiliar.Quadro;
import hardware.MemoriaPrincipal;
import hardware.MemoriaSecundaria;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author Schettino
 */
public abstract class FIFO {

    public static void organizarFilaEscopoGlobal(Pagina pagina) {
        List<Pagina> fila = MemoriaPrincipal.getFilaDePaginas();
        if (!fila.contains(pagina)) {
            fila.add(pagina);
        }
    }

    public static void organizarFilaEscopoLocal(Pagina pagina) {
        List<Pagina> fila = pagina.getProcesso().getFilaMP();
        if (!fila.contains(pagina)) {
            fila.add(pagina);
        }
    }

    public static void organizarFila(Pagina pagina) {
        if (TelaPrincipal.escopo == TelaPrincipal.ESCOPO_GLOBAL) {
            organizarFilaEscopoGlobal(pagina);
        } else {
            if (TelaPrincipal.escopo == TelaPrincipal.ESCOPO_LOCAL) {
                organizarFilaEscopoLocal(pagina);
            }
        }
    }

    public static boolean alocarPagina(Pagina pagina) {
        if (TelaPrincipal.escopo == TelaPrincipal.ESCOPO_GLOBAL) {
            alocarPaginaEscopoGlobal(pagina);
            return true;
        } else {
            if (TelaPrincipal.escopo == TelaPrincipal.ESCOPO_LOCAL) {
                return alocarPaginaEscopoLocal(pagina);
            }
        }
        return false;
    }

    public static void alocarPaginaEscopoGlobal(Pagina pagina) {
        if (MemoriaPrincipal.getEspacoDisponivel() > 0) {
            MemoriaPrincipal.adicionarPagina(pagina);
            TelaSimulador.incrementaFaltaDePaginas();
        } else {
            List<Pagina> fila = MemoriaPrincipal.getFilaDePaginas();
            Pagina paginaOut = fila.remove(0);
            Processo processoOut = paginaOut.getProcesso();
            int i = processoOut.getPaginas().indexOf(paginaOut);
            fila.add(pagina);
            Quadro quadro = MemoriaPrincipal.getQuadros()[processoOut.getTabelaDePaginas().getLinhas().get(i).getNumQuadro()];
            MemoriaPrincipal.adicionarPagina(pagina, quadro);
        }
        organizarFila(pagina);
        TelaSimulador.atualizaTabelaDePaginas(pagina);
    }

    public static boolean alocarPaginaEscopoLocal(Pagina pagina) {
        if (MemoriaPrincipal.getEspacoDisponivel() > 0) {
            MemoriaPrincipal.adicionarPagina(pagina);
            TelaSimulador.incrementaFaltaDePaginas();
        } else {
            List<Pagina> fila = pagina.getProcesso().getFilaMP();
            if (fila.size() < 1) {
                JOptionPane.showMessageDialog(null, "Espaço em memória principal esgotado", "Erro", JOptionPane.ERROR_MESSAGE);
                return false;
            }
            Pagina paginaOut = fila.remove(0);
            Processo processoOut = paginaOut.getProcesso();
            int i = processoOut.getPaginas().indexOf(paginaOut);
            fila.add(pagina);
            Quadro quadro = MemoriaPrincipal.getQuadros()[processoOut.getTabelaDePaginas().getLinhas().get(i).getNumQuadro()];
            MemoriaPrincipal.adicionarPagina(pagina, quadro);
        }
        organizarFila(pagina);
        TelaSimulador.atualizaTabelaDePaginas(pagina);
        return true;
    }
}
